package com.spsa.persistencia.dao;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.persistence.TemporalType;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import com.spsa.excepciones.GuardarDatosException;
import com.spsa.excepciones.RecuperarDatosException;
import com.spsa.negocio.utilidades.UtilFechas;
import com.spsa.persistencia.entidades.EstadoInterfaz;
import com.spsa.persistencia.entidades.Interfaz;

@Stateless
public class EstadoInterfazDao implements Serializable {
	static final Logger logger = LogManager.getLogger(EstadoInterfazDao.class.getName());
	
	@PersistenceContext(unitName="Notificacion")
	private EntityManager em;
	
	public void guardarOrActualizar(EstadoInterfaz estadoInterfaz) throws GuardarDatosException{
		try {
			em.merge(estadoInterfaz);
		}
		catch(Exception e) {
			logger.error("No se pudo guardar un Estado en la BD. " + estadoInterfaz, e);
			throw new GuardarDatosException("No se pudo guardar un Estado en la BD. " + estadoInterfaz);
		}
	}

	public EstadoInterfaz buscarSimilar(EstadoInterfaz estadoInterfaz) throws RecuperarDatosException{

		Query query = em.createQuery("SELECT e FROM EstadoInterfaz e WHERE e.codigoTienda = :codigoTienda "
				+ "AND e.descripcionInterfaz = :descripcionInterfaz AND e.fecha = :fecha");
		query.setParameter("fecha", estadoInterfaz.getFecha());
		query.setParameter("codigoTienda", estadoInterfaz.getCodigoTienda());
		query.setParameter("descripcionInterfaz", estadoInterfaz.getDescripcionInterfaz());

		try {
			return (EstadoInterfaz)query.getSingleResult();
		}
		catch(NoResultException  e){
			return null;
		}
		catch (Exception e) {
			logger.error("No se pudo buscar un Estado en la BD. " + estadoInterfaz, e);
			throw new RecuperarDatosException("Error al buscar un Estado en la BD. " + estadoInterfaz);
		}
	}

	public List<EstadoInterfaz> listarPorInterfaz(Interfaz interfaz) throws RecuperarDatosException{
		List<EstadoInterfaz> estados;

		Query query = em
				.createQuery("SELECT e FROM EstadoInterfaz e WHERE e.descripcionInterfaz = :descripcionInterfaz "
						+ "AND e.fecha = :fecha");

		query.setParameter("fecha", UtilFechas.obtenerHoy(), TemporalType.DATE);
		query.setParameter("descripcionInterfaz", interfaz.getDescripcion());

		try {
			estados = query.getResultList();
		} catch (Exception e) {
			logger.error("No se pudo recuperar la lista de Estados de la BD." + interfaz + " Fecha: " +
					new Date(), e);
			throw new RecuperarDatosException("No se pudo recuperar la lista de Estados de la BD." + interfaz + " Fecha: " +
					new Date());
		}

		return estados;
	}

}
